{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 1\n",
    "\n",
    "Дана переменная, в которой хранится словарь, содержащий гео-метки для каждого пользователя (пример структуры данных приведен ниже). Вам необходимо написать программу, которая выведет на экран множество уникальных гео-меток всех пользователей."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[98, 35, 213, 54, 119, 15]\n"
     ]
    }
   ],
   "source": [
    "ids = {'user1': [213, 213, 213, 15, 213], \n",
    "       'user2': [54, 54, 119, 119, 119], \n",
    "       'user3': [213, 98, 98, 35]}\n",
    "result_set = set()\n",
    "for user_set in ids.values():\n",
    "    result_set.update(set(user_set))\n",
    "print(list(result_set))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 2\n",
    "\n",
    "Дана переменная, в которой хранится список поисковых запросов пользователя (пример структуры данных приведен ниже). Вам необходимо написать программу, которая выведет на экран распределение количества слов в запросах в требуемом виде."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Поисковых запросов, содержащих 2 слов(а): 37.5\n",
      "Поисковых запросов, содержащих 3 слов(а): 50.0\n",
      "Поисковых запросов, содержащих 6 слов(а): 12.5\n"
     ]
    }
   ],
   "source": [
    "queries = [\n",
    "    'смотреть сериалы онлайн',\n",
    "    'новости спорта',\n",
    "    'афиша кино',\n",
    "    'курс доллара',\n",
    "    'сериалы этим летом',\n",
    "    'курс по питону',\n",
    "    'сериалы про спорт',\n",
    "    'скачать бесплатно из торрента супер программу',\n",
    "]\n",
    "\n",
    "query_words_count_dict = {}\n",
    "for querie in queries:\n",
    "    current_query_len = str(len(querie.split(' ')))\n",
    "    query_words_count_dict.setdefault(current_query_len, 0)\n",
    "    query_words_count_dict[current_query_len] += 1\n",
    "    \n",
    "sorted_queries_stats = sorted(query_words_count_dict.items(), key=lambda x: int(x[0]))\n",
    "    \n",
    "for count_words, queries_count in sorted_queries_stats:\n",
    "    print(f'Поисковых запросов, содержащих {count_words} слов(а): {round(queries_count*100/len(queries), 2)}')\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 3\n",
    "\n",
    "Дана переменная, в которой хранится информация о затратах и доходе рекламных кампаний по различным источникам. Необходимо дополнить исходную структуру показателем ROI, который рассчитаем по формуле: (revenue / cost - 1) * 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'vk': {'revenue': 103, 'cost': 98, 'ROI': 5.1}, 'yandex': {'revenue': 179, 'cost': 153, 'ROI': 16.99}, 'facebook': {'revenue': 103, 'cost': 110, 'ROI': -6.36}, 'adwords': {'revenue': 35, 'cost': 34, 'ROI': 2.94}, 'twitter': {'revenue': 11, 'cost': 24, 'ROI': -54.17}}\n"
     ]
    }
   ],
   "source": [
    "# Задача решается на понимании неизменности объекта в памяти при присваивании его другой переменной\n",
    "\n",
    "results = {\n",
    "    'vk': {'revenue': 103, 'cost': 98},\n",
    "    'yandex': {'revenue': 179, 'cost': 153},\n",
    "    'facebook': {'revenue': 103, 'cost': 110},\n",
    "    'adwords': {'revenue': 35, 'cost': 34},\n",
    "    'twitter': {'revenue': 11, 'cost': 24},\n",
    "}\n",
    "\n",
    "for statistic in results.values():\n",
    "    roi = round((statistic['revenue']/statistic['cost'] - 1)*100, 2)\n",
    "    statistic['ROI'] = roi\n",
    "        \n",
    "print(results)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 4\n",
    "\n",
    "Дана переменная, в которой хранится статистика рекламных каналов по объемам продаж (пример структуры данных приведен ниже). Напишите программу, которая возвращает название канала с максимальным объемом продаж."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Вариант 1\n",
      "Максимальный объем продаж на рекламном канале: vk\n",
      "Вариант 2\n",
      "Максимальный объем продаж на рекламном канале: vk\n"
     ]
    }
   ],
   "source": [
    "stats = {'facebook': 55, 'yandex': 115, 'vk': 120, 'google': 99, 'email': 42, 'ok': 98}\n",
    "sorted_sources = sorted(stats.items(), key=lambda x: x[1], reverse=True)\n",
    "print('Вариант 1')\n",
    "print(f'Максимальный объем продаж на рекламном канале: {sorted_sources[0][0]}')\n",
    "\n",
    "# Вариант 2 без sorted\n",
    "reversed_dict = {}\n",
    "for source, summ in stats.items():\n",
    "    reversed_dict[str(summ)] = source\n",
    "summ_list = [int(summ) for summ in reversed_dict.keys()]\n",
    "summ_list.sort()\n",
    "max_summ = summ_list[-1]\n",
    "print('Вариант 2')\n",
    "print(f'Максимальный объем продаж на рекламном канале: {reversed_dict[str(max_summ)]}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 5 (необязательно)\n",
    "\n",
    "Дан список произвольной длины. Необходимо написать код, который на основе исходного списка составит словарь такого уровня вложенности, какова длина исхондого списка."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Вариант 1:  {'2018-01-01': {'yandex': {'cpc': 100}}}\n",
      "Вариант 2:  {'2018-01-01': {'yandex': {'cpc': 100}}}\n"
     ]
    }
   ],
   "source": [
    "my_list = ['2018-01-01', 'yandex', 'cpc', 100]\n",
    "my_list.reverse()\n",
    "for i in range(0, len(my_list)-1):\n",
    "    key = str(my_list[i+1])\n",
    "    if i == 0:\n",
    "        value = my_list[i]\n",
    "        my_dict = {key: value}\n",
    "    else:\n",
    "        my_dict = {key: my_dict}\n",
    "        \n",
    "print('Вариант 1: ', my_dict)\n",
    "\n",
    "# Решение через enumerate\n",
    "for index, value in enumerate(my_list):\n",
    "    if index == len(my_list)-1:\n",
    "        break\n",
    "    key = str(my_list[index+1])\n",
    "    if index == 0:\n",
    "        my_dict = {key: value}\n",
    "    else:\n",
    "        my_dict = {key: my_dict}\n",
    "        \n",
    "print('Вариант 2: ', my_dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 6 (необязательно)\n",
    "\n",
    "Дана книга рецептов с информацией о том, сколько ингредиентов нужно для приготовления блюда в расчете на одну порцию (пример данных представлен ниже).\n",
    "Напишите программу, которая будет запрашивать у пользователя количество порций для приготовления этих блюд и отображать информацию о суммарном количестве требуемых ингредиентов в указанном виде.\n",
    "Внимание! Одинаковые ингридиенты с разными размерностями нужно считать раздельно!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Введите количество порций: 3\n",
      "сыр: 210 гр\n",
      "томаты: 6 шт\n",
      "томаты: 60 гр\n",
      "огурцы: 60 гр\n",
      "маслины: 30 гр\n",
      "оливковое масло: 60 мл\n",
      "салат: 30 гр\n",
      "перец: 60 гр\n",
      "колбаса: 90 гр\n",
      "бекон: 90 гр\n",
      "оливки: 30 гр\n",
      "тесто: 300 гр\n",
      "лимон: 3 шт\n",
      "вода: 600 мл\n",
      "сахар: 30 гр\n",
      "лайм: 60 гр\n"
     ]
    }
   ],
   "source": [
    "import re\n",
    "\n",
    "cook_book = {\n",
    "  'салат': [\n",
    "     {'ingridient_name': 'сыр', 'quantity': 50, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'томаты', 'quantity': 2, 'measure': 'шт'},\n",
    "     {'ingridient_name': 'огурцы', 'quantity': 20, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'маслины', 'quantity': 10, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'оливковое масло', 'quantity': 20, 'measure': 'мл'},\n",
    "     {'ingridient_name': 'салат', 'quantity': 10, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'перец', 'quantity': 20, 'measure': 'гр'}\n",
    "    ],\n",
    "  'пицца': [\n",
    "     {'ingridient_name': 'сыр', 'quantity': 20, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'колбаса', 'quantity': 30, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'бекон', 'quantity': 30, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'оливки', 'quantity': 10, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'томаты', 'quantity': 20, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'тесто', 'quantity': 100, 'measure': 'гр'},   \n",
    "    ],\n",
    "  'лимонад': [\n",
    "     {'ingridient_name': 'лимон', 'quantity': 1, 'measure': 'шт'},\n",
    "     {'ingridient_name': 'вода', 'quantity': 200, 'measure': 'мл'},\n",
    "     {'ingridient_name': 'сахар', 'quantity': 10, 'measure': 'гр'},\n",
    "     {'ingridient_name': 'лайм', 'quantity': 20, 'measure': 'гр'},    \n",
    "    ]\n",
    "}\n",
    "\n",
    "\n",
    "\n",
    "def check_natural_number(number):\n",
    "    \"\"\"Функция проверяет является ли число натуральным\"\"\"\n",
    "    number = str(number)\n",
    "    if re.compile(r'^[1-9]\\d*$').search(number) is None:\n",
    "        return 1\n",
    "    return 0\n",
    "\n",
    "while True:\n",
    "    count = input(\"Введите количество порций: \")\n",
    "    return_code = check_natural_number(count)\n",
    "    if return_code != 0:\n",
    "        print('Некорректно введено кол-во порций, требуется ввести целое число')\n",
    "        continue\n",
    "    count = int(count)\n",
    "    break\n",
    "\n",
    "# Будем составлять список в формате {название ингридиента: {измерение: кол-во}}\n",
    "result_ingridients_dict = {}\n",
    "for ingridients_list in cook_book.values():\n",
    "    for ingridient_dict in ingridients_list:\n",
    "        ingridient_name = ingridient_dict['ingridient_name'].lower()\n",
    "        measure = ingridient_dict['measure']\n",
    "        quantity = ingridient_dict['quantity'] * count\n",
    "        result_ingridients_dict.setdefault(ingridient_name, {})\n",
    "        if result_ingridients_dict[ingridient_name].get(measure) is None:\n",
    "            result_ingridients_dict[ingridient_name][measure] = 0\n",
    "        result_ingridients_dict[ingridient_name][measure] += quantity\n",
    "            \n",
    "for ingridient_name, measures in result_ingridients_dict.items():\n",
    "    for measure_name, measure in measures.items():\n",
    "        print(f'{ingridient_name}: {measure} {measure_name}')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
